/**
 * 装饰者模式 面上切面编程（AOP）
 *  在调用一个方法之前调用自己定义的方法
 *  借助Function的原型，在原型上定义一个方法，在所有声明的方法上都可用通过点出来
 *  1、在Function的原型上定义方法，让方法共享
 *  2、构造一个匿名函数，在调用之前都用自己定义的方法
 *  3、箭头函数巧妙的this指向，...args聚合实参集合，方法调用的（...args）解构实参集合
 */

function core(a, b, c) {
  console.log(a, b, c, "执行核心方法");
}
//
Function.prototype.before = function(beforeFn) {
  return (...args) => {
    //执行自己定义的方法
    beforeFn();
    //执行核心方法
    this(...args);
  };
};

core.before(() => {
  console.log("定义自己执行的方法");
})(1, 2, 3);



